カーソルの位置に合わせてサブメニューを表示する
今回は、前回のテクニックを応用し、カーソルの位置に合わせてリンクのサブメニューを表示/非表示させるテクニックを紹介します。多少ソースが長くなってしまいますが、それほど難しい内容ではありません。ぜひチャレンジしてみてください。

→ メニュー、サブメニュー用のスタイルシート
 
今回のテクニックでは、メニューやサブメニューが表示される位置を指定しなければいけません。このためには、各「DIV」タグのサイズを固定する必要があります。以下のように、「menu」「submenu」といったクラスのスタイルシートを作成し、サイズを固定しておきましょう。今回は「menu」のサイズを幅100×高さ25ピクセル、「submenu」のサイズを幅100ピクセル(高さは可変です)に指定しました。また、それぞれのクラスについて、背景色、枠線、文字の書式の指定も行います。そのほか、リンク文字について「下線なし」、文字色を「白」に指定します。
<STYLE type="text/css">
<!--

.menu{
  width:100px;                  /* 幅(100px) */
  height:25px;                  /* 高さ(25px) */
  color:#FFFFFF;             /* 文字色(白) */
  font-size:12pt;              /* 文字サイズ(12pt) */
  text-align:center;          /* 文字(中央揃え) */
  background-color:#0000AA;    /* 背景色(青) */
  border-style:solid;          /* 枠線(四角) */
  border-width:3px;           /* 枠線の幅(3px) */
  border-color:#8888FF;     /* 枠線の色(薄い青) */
}

.submenu{
  width:100px;                  /* 幅(100px) */
  font-size:12pt;               /* 文字サイズ(12pt) */
  text-align:center;            /* 文字(中央揃え) */
  background-color:#AAAAFF;    /* 背景色(薄い青) */
  border-style:solid;           /* 枠線(四角) */
  border-width:1px;            /* 枠線の幅(1px) */
  border-color:#888888;       /* 枠線の色(グレー) */
}

a{text-decoration:none}       /* リンクの飾り(なし) */
a:link{color:#FFFFFF}          /* リンクの色(白) */
a:visited{color:#FFFFFF}      /* 訪問済みリンクの色(白) */

//-->
</STYLE>


→ メニューの作成
 
続いて、「BODY」タグ内にメニューを作成します。各メニューは「DIV」タグでブロック化し、「menu」のクラスを指定します。また、「position:absolute」のスタイルシートを適用し、「DIV」タグが絶対的な位置に配置されるようにします。位置の指定は「top」および「left」に座標を記述します。今回の例では、上と左に20ピクセルの余白を設けました。「menu」の「DIV」タグの幅は100ピクセルなので、左の座標は順に「20px」「120px」「220px」「320px」と変化していきます。 なお、サブメニューを表示させるメニュー(「DIV」タグ)にはonMouseOverイベントを追加し、サブメニューを表示させるJavaScript関数「hyouji()」を呼び出します。同様に、カーソルがメニューの外に出たときにサブメニューを非表示にするJavaScript関数「kakusu()」もonMouseOutイベントで追加します。
<DIV style="position:static;">
<DIV class="menu" style="position:absolute; left:20px">
<A href="sample01.html">HOME</A>
</DIV>

<DIV class="menu" style="position:absolute; left:120px"
onMouseOver="hyouji('submenu_1')" onMouseOut="kakusu('submenu_1')">
Whats New
</DIV>

<DIV class="menu" style="position:absolute; left:220px"
     onMouseOver="hyouji('submenu_2')" onMouseOut="kakusu('submenu_2')">
Photo
</DIV>

<DIV class="menu" style="position:absolute; left:320px"
     onMouseOver="hyouji('submenu_3')" onMouseOut="kakusu('submenu_3')">
Illustration
</DIV>
</DIV>


→ サブメニューの作成
 
サブメニューも同様に「DIV」タグでブロック化し、「submenu」のクラスを指定します。また、それぞれ個別のidを指定しておきます。サブメニューを表示する位置は、「top」が(余白20)+(メニューの高さ25)=45ピクセル、「left」がメニューと同じ位置となります。そのほか、「visibility」に「hidden」を指定し、初期状態でサブメニューを非表示にしておく必要もあります。 JavaScriptの方は、onMouseOverイベントを追加し、自分自身を表示させるJavaScript関数「hyouji()」を呼び出します。これは、メニューのonMouseOutイベントでサブメニューが非表示になるのを防ぐためです。マウスカーソルがサブメニューの外に出たときは、onMouseOutイベントで自分自身を非表示にするJavaScript関数「kakusu()」を呼び出します。
<DIV style="position:static; padding-top:25px">
<DIV id="submenu_1" class="submenu"
     style="position:absolute; left:120px; visibility:hidden"
     onMouseOver="hyouji('submenu_1')" onMouseOut="kakusu('submenu_1')">
<A href="0410.htm">2004.10</A><BR>
<A href="0409.htm">2004.09</A><BR>
<A href="0408.htm">2004.08</A><BR>
</DIV>

<DIV id="submenu_2" class="submenu"
     style="position:absolute; left:220px; visibility:hidden"
     onMouseOver="hyouji('submenu_2')" onMouseOut="kakusu('submenu_2')">
<A href="photo1.htm">photo 1</A><BR>
<A href="photo2.htm">photo 2</A><BR>
</DIV>

<DIV id="submenu_3" class="submenu"
     style="position:absolute; left:320px; visibility:hidden"
     onMouseOver="hyouji('submenu_3')" onMouseOut="kakusu('submenu_3')">
<A href="illust1.htm">illust 1</A><BR>
<A href="illust2.htm">illust 2</A><BR>
<A href="illust3.htm">illust 3</A><BR>
</DIV>
</DIV>


→ JavaScript関数の作成
 
あとは、サブメニューを表示するJavaScript関数「hyouji()」、およびサブメニューを非表示にするJavaScript関数「kakusu()」を作成すれば完成です。表示/非表示を変更する対象(id名)は、関数を呼び出す際のカッコ内の文字を「ss」や「tt」に引き渡すことで指定できます。
<SCRIPT language="JavaScript">
<!--

function hyouji(ss)
  {document.getElementById(ss).style.visibility="visible"}

function kakusu(tt)
  {document.getElementById(tt).style.visibility="hidden"}

//-->
</SCRIPT>


G|Cg|C@Amazon Yahoo yV

z[y[W yVoC[UNLIMIT1~] COiq COsI